package model.PokerTP;


import java.util.Arrays;

import model.messages.TableSettings;
import akka.actor.UntypedActor;

public class Table extends UntypedActor {
	//private Human[] clowiek;
	//private Bot [] kbot;
	private Player[] gracze;
	private Deck talia;
	public int wpisowe = 0;
	public int poczatkoweZetony = 1;
	
	public Table() {}
	
	public Table(int g,int b) throws Blad {
	   
		init(g, b);
	}

		
	public void Game()
	{
		// ka�dy gracz wykonuje ruch w kolejnosci jak w tabeli:
		for(Player gracz : gracze)
		{
			try {
				gracz.wykonajSwojRuch();
			} catch(NullPointerException e)
			{
				System.out.println("BLAD: " + e.getMessage());
			}
		}
		// wy�anianie zwyci�zcy
		Player[] kopiaTabeliGraczy = gracze.clone();
		Arrays.sort(kopiaTabeliGraczy, null); // metoda sort wykorzystuje metode compareTo, porzadkuje od NAJMNIEJSZEGO do NAJWIEKSZEGO
		
		System.out.println(String.format("\n\nZWYCI�ZCA: %s\n", kopiaTabeliGraczy[kopiaTabeliGraczy.length - 1].getNazwa()));
		
	}

	@Override
	public void onReceive(Object message) throws Exception {
		// TODO Automatycznie generowany szkielet metody
		if(message instanceof TableSettings) {
			initTable((TableSettings)message);
		}
		else
			unhandled(message);
	}
	
	private void init(int g, int b) {
		//if(g+b<2||g+b>4)throw new Blad("z�a liczba os�b") ;
		if((g+b < 2 || g+b > 4) || (g < 0 || b < 0))
			throw new Blad("Z�a liczba os�b.");
		
		gracze = new Player[g+b];
		
		int i, j;
		
		// ludzie:
		for(i = 0; i < g; ++i)
		{
			gracze[i] = new Human();
			gracze[i].setNazwa("Gracz " + i);
			
		}
		
		// boty:
		for(j = 0; j < b; ++j)
		{
			if(j % 2 == 0)
			{
				gracze[j + g] = new Bot2();
				gracze[j + g].setNazwa("BotV2 " + j);
			}
			else
			{
				gracze[j + g] = new Bot();
				gracze[j + g].setNazwa("Bot " + j);
			}
		}
		//zak�ady
		Licytacja licytuj=new Licytacja(gracze,g+b);
		licytuj.Wpisowe(5);
		licytuj.Lic();
		// ustawienie kart:
		talia = new Deck();
		Card[][] receGraczy = new Card[g+b][5];
		
		// rozdawanie po jednej karcie
		for(i = 0; i < 5; ++i)
		{
			for(j = 0; j < g+b; ++j)
			{
				receGraczy[j][i] = talia.wypiszzTali();
			}
		}
		
		for(i = 0; i < gracze.length; ++i)
		{
			gracze[i].ustawReke(receGraczy[i]); // przypisuje karty danemu graczowi
			gracze[i].ustawTalie(talia); // przypisuje graczowi referencje do talii, z kt�rej mo�e korzystac
		}
		/*
		
		*/
	}
	
	private void initTable(TableSettings settings) {
		if(settings == null) throw new NullPointerException();
		init(settings.humanPlayers, settings.computerPlayers);
		poczatkoweZetony = settings.startTokens;
		wpisowe = settings.entranceFee;
	}
	
	
}
   
